#ifndef __PROTOCAL_DEFINE_h
#define __PROTOCAL_DEFINE_h

#include "stdint.h"

#pragma pack(1)
typedef enum {
    CMDHEARTBEAT = 0X0,               // 心跳指令
    CMDGETSIGNALTABLE = 0X11,         // 信号表获取指令
    CMDSETPAYLOADPARAMETER = 0X22,    // 载荷参数设置指令
    CMDUAVCTRL = 0X33,                // 人机飞控指令
    CMDSETREMOTEPOWEROFF = 0X44,      // 远程关机控制指令
    CMDSETFLIGHTCTRLPARAMETER = 0X55, // 飞控参数设置指令
    CMDSETPAYLOADCONTROL = 0X66,      // 载荷控制指令
    CMDGETUAVSTATUS = 0X77,           // 无人机状态获取指令
    CMDGETPAYLOADSTATUS = 0X88,       // 载荷状态获取指令
    CMDIQINFORMATION = 0X99,          // IQ信息传输指令
    CMDIQBULK = 0X9A,                 // IQ数据块传输指令
    CMDDATAREMOVE = 0XAA,             // 数据卸载指令
    CMDTARGETPOSITON = 0XBB,          // 靶机定位指令
    CMDTARGETLOADSIMULATEDATA = 0XCC, // 靶标加载模拟数据指令
} UAVCmd_t;

// 心跳指令报文
typedef struct {
    uint16_t head;
    uint8_t cmd;
    uint16_t checksum;
    uint16_t tail;
} heartbeatcmd_t;

// 无人机状态获取发送报文格式
typedef struct {
    uint16_t head;
    uint8_t cmd;
    uint8_t statusread1;
    uint8_t statusread2;
    uint8_t reserved[5];
    uint16_t checksum;
    uint16_t tail;
} uavstatuscmd_t;

// 载荷状态获取发送报文格式
typedef struct {
    uint16_t head;
    uint8_t cmd;
    uint8_t dataread;
    uint8_t reserved[5];
    uint16_t checksum;
    uint16_t tail;
} loadstatuscmd_t;

// 飞控参数设置发送报文格式
typedef struct {
    uint16_t head;
    uint8_t cmd;
    uint8_t mode;
    uint8_t taskdesc;
    float takeoffspeed;
    uint8_t reserved1[10];
    uint8_t flighttrackcharacteristics;
    uint16_t flighttrackpointnumber;
    float longitude;
    float latitude;
    float height;
    float speed;
    uint16_t residence;
    float direction;
    uint8_t reserved2[4];
    uint8_t reserved3[22];
    uint16_t checksum;
    uint16_t tail;
} setuavparamcmd_t;

// 信号表数据获取发送报文格式
typedef struct {
    uint16_t head;
    uint8_t cmd;
    uint8_t receivectrl;
    uint8_t reserved[5];
    uint16_t checksum;
    uint16_t tail;
} getsingaltablecmd_t;

// 靶标参数设置发送报文格式头
typedef struct {
    uint16_t head;     // 0xea90	传输报文包头
    uint8_t cmd;       // 0x22-表示载荷控制指令
    uint8_t signalNum; // 辐射信号数N表示设置的辐射信号数量，0~10，最多支持设置10个辐射信号
    // signaldescrip signal;
    // TBD	19*(N-1)	　	//辐射信号N描述 N表示设置的辐射信号数量
    // uint16_t checksum; //
    // 校验和，校验方式：除包头、包尾、备份、校验和外的所有字节，按字节内容相加；如有溢出，则舍弃溢出位。
    // uint16_t tail;  // 0xfaf3	传输报文包尾
} setpayloadparametercmdhead_t;

typedef struct {
    int16_t power;       // 靶标辐射功率dbm，控制目标IP=1、2、3时有效，默认值为0
    uint8_t type;        // 信号类型 设置靶标信号类型
                         // 0-自定义波形（播放模式），1-预定义波形（子产生模式）
    uint32_t frequency;  // 辐射频率 设置靶标辐射频率，单位KHz；
    uint16_t bandwidth;  // 辐射带宽 设置靶标辐射带宽，单位KHz；
                         // 25KHz，60KHz，200kHz，1MHz，6.5MHz默认值为0
    uint8_t modulation;  // 调试方式 设置信号调试方式，0-BSPK、1-QPSK、2-DBPSK、3-DQPSK、4-8PSK
    uint32_t frameDelay; // 帧延时 设置信号帧相对延时时间，单位ns
    uint8_t
        frameStructure; // 信号帧结构
                        // 设置信号帧结构帧长，1-1ms，2-10ms，3-100ms，4-1s，5-10s，默认=0其他预留
    uint8_t reserved[4];
} target_signal_def; // 载荷参数设置的信号描述

// 靶标参数设置发送报文格式尾
typedef struct {
    // uint16_t head;          // 0xea90	传输报文包头
    // uint8_t cmd;            // 0x22-表示载荷控制指令
    // uint8_t signalNum;      // 辐射信号数N表示设置的辐射信号数量，0~10，最多支持设置10个辐射信号
    // signaldescrip signal;
    // TBD	19*(N-1)	　	//辐射信号N描述 N表示设置的辐射信号数量
    uint16_t
        checksum; // 校验和，校验方式：除包头、包尾、备份、校验和外的所有字节，按字节内容相加；如有溢出，则舍弃溢出位。
    uint16_t tail; // 0xfaf3	传输报文包尾
} setpayloadparametercmdtail_t;

// 空基、路基参数设置发送报文格式
typedef struct {
    uint16_t head;         // 0xea90	传输报文包头
    uint8_t cmd;           // 0x22-表示载荷控制指令
    uint8_t mode;          // 频谱感知模式 0-全频段；1-指定频段；2-窄带扫描；3-盲采；其他-预留,
                           // 默认值为0，控制目标=4、5、6、7、8、9、10、11时有效
    uint32_t maxFrequency; // 感知点频率上限
    uint32_t minFrequency; // 感知点频率下限
    uint16_t maxBandwidth; // 感知点带宽上限
    uint16_t minBandwidth; // 感知点带宽下限
    float residenceTime;   // 感知点驻留时间
    uint8_t attenuation;
    uint8_t reserved1[3];
    uint8_t signalNum; // 感知信号数
} sense_config_para_t;
// 空基、路基参数设置发送报文格式
typedef struct {
    uint32_t frequency; // 窄带扫描频率，单位KHz；
    uint16_t bandwidth; // 窄带扫描带宽单位KHz
    uint8_t reserved2[6];
    // 备份	TBD	12*(N-1)	　	N表示设置的引导感知频点数量
} setairpayloadsignaldescrip_t;
// 空基、路基参数设置发送报文格式
typedef struct {
    uint16_t
        checksum; // 校验和，校验方式：除包头、包尾、备份、校验和外的所有字节，按字节内容相加；如有溢出，则舍弃溢出位。
    uint16_t tail; // 0xfaf3	传输报文包尾
} setairpayloadparametercmdtail_t;

typedef enum {
    UAVNORESPOND = 0,
    UAVTAKEOFF = 1,
    UAVHOVER = 2,
    UAVFLIGHT = 3,
    UAVLAND = 4,
} uavflightctrlenum_t;
// 无人机飞控指令
typedef struct {
    uint16_t head; // 0xea90	传输报文包头
    // 0x33-表示起飞控制指令
    uint8_t cmd;
    /* 起飞控制指令  0 - 不响应，1 - 开始起飞（起飞调整），2 - 悬停，3 - 飞行（开始执行任务），4 -
   降落， 默认值为0 NAV_CMD_NAV_TAKOFF(22) MAV_CMD_NAV_LAND(21)，降落需要设定经纬度，高度的参数吗？
   MAV_CMD_NAV_RETURN_LAUNCH(20) 悬停没有找到，使用MAV_CMD_DO_REPOSITION(192)？
   MAV_CMD_MISSION_START(300) */
    uint8_t control;
    uint16_t
        checksum; // 校验和，校验方式：除包头、包尾、备份、校验和外的所有字节，按字节内容相加；如有溢出，则舍弃溢出位。
    uint16_t tail; // 0xfaf3	传输报文包尾
} uavflightctrlcmd_t;

// 设置远程关机
typedef struct {
    uint16_t head;   // 0xea90	传输报文包头
    uint8_t cmd;     // 0x44-表示启停控制指令
    uint8_t control; // 启停控制 b0: 0-上电/启动/无响应，1-关机/断电
    uint16_t
        checksum; // 校验和，校验方式：除包头、包尾、备份、校验和外的所有字节，按字节内容相加；如有溢出，则舍弃溢出位。
    uint16_t tail; // 0xfaf3	传输报文包尾
} setremotepoweroffcmd_t;

// 飞控参数设置指令
typedef struct {
    uint16_t head;      // 0xea90	传输报文包头
    uint8_t cmd;        // 0x55-表示飞行任务参数设置指令
    uint8_t flightMode; // 飞行模式 0-任务模式，1-位置模式，2-定高模式, 其他-未知模式，默认值为0
    uint8_t
        TaskDescription;   /* 任务描述 b0:任务特征，0-新任务，1-改航任务
  b1:任务属性，0-单任务，1-多任务 b2:起飞调整，0-否，1-是
  b3:事后自动降落，0-悬停等待降落控制指令，1-任务完成后自动降落 b4~b7:备份
  备注：单任务执行（单个任务执行完成，返回任务执行完成消息），多任务依次执行（有多个飞行任务航迹，按收到的先后顺序依次执行，
  所有任务执行完毕后返回任务执行完成消息）；起飞调整=0表示飞到首个航点后悬停等待起飞指令，起飞调整=1表示不悬停直接开始执行任务*/
    float takeoffVelocity; // 起飞调整速度 TBD	单位km/h, 默认值=5km/h
    uint8_t reserved1[10]; // 备份参数 预留10个字节参数位，默认为0
    uint8_t
        trackCharacteristics; // 航迹特征 0-开环航迹，1-闭环航迹，2-改航航迹, 其他-未知，默认值为0
    uint16_t waypointsNumber; // 航迹包含的航点数目N，一个航点包含22个字节的信息描述
    float waypointsLongitude; // 航点经度，单位°度
    float waypointsLatitude;  // 航点纬度，单位°度
    float
        waypointsDepth; // 航点高度
                        // 指相对飞行高度，又叫真高（对地高度）；国标轻小型无人机飞行高度真高<120m（500m），默认值为100m
                        // ，单位米
    float velocity;       // 飞行速度 单位km/h, 默认值=8km/h
    uint16_t flightTime;  // 航点停留时间 飞行时间，航点飞行时间，单位秒，默认值为64800（18小时）
    float direction;      // 机头方向 以正北为0°角，顺时针0~360 °角。单位°度，默认值为0
    uint8_t reserved2[4]; // 备份字段	　	　
    //	TBD	22*(N-1)	　	//航点N描述 N表示航迹航点数
    uint16_t
        checksum; // 校验和，校验方式：除包头、包尾、备份、校验和外的所有字节，按字节内容相加；如有溢出，则舍弃溢出位。
    uint16_t tail; // 0xfaf3	传输报文包尾
} setflightctrlparametercmd_t;

// 载荷控制指令发送报文格式
typedef struct {
    uint16_t head; // 0xea90	传输报文包头
    uint8_t cmd;   // 0x66-表示载荷节点使能指令
    uint8_t
        enable; // b0~b3:
                // 0-不响应，1-载荷节点辐射/感知功能关闭，2-载荷节点辐射/感知功能开启，3-载荷远程重启，4-载荷远程断电，默认0
                // b4 ~b7 : 备份，默认值为0
    uint8_t reserved1[5];
    uint16_t
        checksum; // 校验和，校验方式：除包头、包尾、备份、校验和外的所有字节，按字节内容相加；如有溢出，则舍弃溢出位。
    uint16_t tail; // 0xfaf3	传输报文包尾
} setpayloadctrlcmd_t;

// 无人机状态获取发送报文格式
typedef struct {
    uint16_t head; // 0xea90	传输报文包头
    uint8_t cmd;   // 0x77
    uint8_t status1;
    uint8_t status2;
    uint8_t reserved[5];
    uint16_t
        checksum; // 校验和，校验方式：除包头、包尾、备份、校验和外的所有字节，按字节内容相加；如有溢出，则舍弃溢出位。
    uint16_t tail; // 0xfaf3	传输报文包尾
} getuavstatuscmd_t;

// 获取载荷状态
typedef struct {
    uint16_t head;    // 0xea90	传输报文包头
    uint8_t cmd;      // 0x88 -表示节点状态指令
    uint8_t dataread; // 节点数据读取	b0:读取载荷状态信息，0-否，1-是
                      // b1:读取载荷参数设置，0-否，1-是 b2:读取载荷告警信息，0-否，1-是 b3~b7:备用
    uint8_t reserved[5]; // 备份字节
    uint16_t
        checksum; // 校验和，校验方式：除包头、包尾、备份、校验和外的所有字节，按字节内容相加；如有溢出，则舍弃溢出位。
    uint16_t tail; // 0xfaf3	传输报文包尾
} getpayloadstatuscmd_t;

// 定位中频数据传输发送报文格式
typedef struct {
    uint16_t head; // 0xea90	传输报文包头
    uint8_t cmd;
    uint8_t midfreqctrl;
    uint8_t reserved[5];
    uint16_t
        checksum; // 校验和，校验方式：除包头、包尾、备份、校验和外的所有字节，按字节内容相加；如有溢出，则舍弃溢出位。
    uint16_t tail; // 0xfaf3	传输报文包尾
} positionmidfreqcmd_t;

// 数据卸载指令发送报文格式
typedef struct {
    uint16_t head; // 0xea90	传输报文包头
    uint8_t cmd;
    uint8_t dataremovecmd; // 数据卸载指令 b0~b3:0-停止传输数据，1-开始传输数据
                           // ，2-暂停传输数据，3-继续传输数据，4-获取数据总大小，
    // 5-获取传输百分比，其它-备份，默认值=0 b4~b7: 0-不响应，1-读取信号表
    // ，2-卸载指定N个信号的中频数据
    uint16_t id;
    // uint8_t N;          // 指定信号个数 固定为1
    // 当数据卸载指令b4~b7=2时有效，表示要依次卸载下面的指定信号中频数据
    uint32_t frequency; // 指定卸载信号的频率
    uint16_t bandwidth; // 指定卸载信号的带宽
    uint8_t reserved[5];
    uint16_t
        checksum; // 校验和，校验方式：除包头、包尾、备份、校验和外的所有字节，按字节内容相加；如有溢出，则舍弃溢出位。
    uint16_t tail; // 0xfaf3	传输报文包尾
} dataremovecmd_t;

// 靶机定位指令发送报文格式
typedef struct {
    uint16_t head; // 0xea90	传输报文包头
    uint8_t cmd;
    uint8_t datatransmit;
    uint8_t ip1;
    uint8_t ip2;
    uint8_t ip3;
    uint8_t ip4;
    uint8_t ip5;
    uint8_t ip6;
    uint8_t reserved[5];
    uint16_t
        checksum; // 校验和，校验方式：除包头、包尾、备份、校验和外的所有字节，按字节内容相加；如有溢出，则舍弃溢出位。
    uint16_t tail; // 0xfaf3	传输报文包尾
} positiontargetcmd_t;

// 靶标加载模拟数据发送报文格式
typedef struct {
    uint16_t head; // 0xea90	传输报文包头
    uint8_t cmd;
    uint8_t loadsignalnumber; // 加载信号序号 发送的信号顺序编号
    uint8_t subpktnumber;     // 信号子包序号 当前发送的中频数据是信号的第几包数据
    float samplerate;
    // 采样率 信号采样率MHz
    uint16_t IQdatalength; // IQ数据长度 中频IQ包数量
} targetloadsimulatedatacmdhead_t;

typedef struct {
    short IQI; // IQ数据 中频数据I
    short IQQ; // 中频数据Q
} IQstruct_t;

typedef struct {
    uint16_t
        checksum; // 校验和，校验方式：除包头、包尾、备份、校验和外的所有字节，按字节内容相加；如有溢出，则舍弃溢出位。
    uint16_t tail; // 0xfaf3	传输报文包尾
} targetloadsimulatedatacmdtail_t;

#pragma pack()
#endif
